Moduł:Lang
local lang = {} local function langData(code) if not code or (#code 0) then -- brak kodu języka mw.log("Pusty kod języka: "..code); return end local data = mw.loadData( 'Module:lang/data' ) -- bezbłędny kod local lang = datacode if lang then return lang, code end -- może kod jest podany dużymi literami lub ma spacje przed i po local lcode = mw.text.trim(string.lower(code)) -- dobre kody języka są tylko w ASCII lang = datalcode if lang then mw.log('kod "'..code..'" został zamieniony na "'..lcode..'"') return lang, lcode end -- może kod jest podany z variantem local scode = string.match(lcode, "^(a-z+)_-") lang = datascode if scode then mw.log('kod "'..code..'" został zinterpretowany jako "'..scode..'"') return lang, scode end -- poddaje się mw.log('Nieznany kod języka: "'..code..'"'); return false, code end function lang.istnieje(frame) local languageData, code = langData(frame.args1) return languageData and code or nil end function lang.kursywa(frame) local languageData, code = langData(frame.args1) return (languageData and (languageData.kursywa ~= false)) and "" or "" end lang"hasło" = function(frame) local languageData, _ = langData(frame.args1) return languageData'hasło' end lang"skrót" = function(frame) local languageData, _ = langData(frame.args1) return languageData'skrót' or languageData'mianownik' end function lang.mianownik(frame) local languageData, _ = langData(frame.args1) return languageData'mianownik' end lang"dopełniacz" = function(frame) local languageData, _ = langData(frame.args1) return languageData'dopełniacz' end function lang.miejscownik(frame) local languageData, _ = langData(frame.args1) return languageData'miejscownik' end function list(frame, multi, showPL) -- konwersja kodów języków na kod wiki text opisujący kody local items = {} -- tabela na skonwertowane kody -- flagi informujące, że na liście znajdują się podejrzane kody local invalid = false -- nieznany kod języka local warning = false -- język z listy częstych błędów local hiddenpl = false -- ukryty język polski local modified = false -- kod języka z automatyczną korektą local duplicated = false -- wielokrotnie podany (prawie) taki sam kod języka local args = frame.args; if not args1 then -- brak argumentów sugeruje wywołanie z szablonu local parent = frame:getParent() if parent then args = parent.args end end if not args1 then return "'Błąd! Brak kodu języka." end -- języki wpadające do wikipedia:pl:Kategoria:Częste błędy kodu w szablonie lang local warnings = { ee = true, am = true, an = true, ang = true, ng = true, kr = true, se = true, si = true } local formatLanguageItem = function(langCode, languageData) local skrot = languageData'skrót' or languageData'mianownik' local nativeName = mw.language.fetchLanguageName(langCode) if nativeName and #nativeName > 0 and langCode ~= "pl" then return string.format("%s", languageData'hasło', languageData'miejscownik', nativeName, skrot) else return string.format("%s", languageData'hasło', languageData'miejscownik', skrot) end end local parsedLanguages = {} local countGood = 0 local formatItem = function(languageCode) local languageData, langCode = langData(languageCode) if langCode and (languageCode ~= langCode) then modified = true end if languageData then if warningslangCode then warning = true end local item = formatLanguageItem(langCode, languageData) if parsedLanguageslangCode then duplicated = true mw.log("Powtórne przywołanie języka ("..languageCode..")") else parsedLanguageslangCode = item; if (langCode "pl") and not showPL then -- pomiń język polski hiddenpl = true mw.log("Ukrywam język polski") else table.insert(items, item) countGood = countGood + 1 end end elseif not langCode or #langCode 0 then if #items 0 then -- pierwszy kod nie może być pusty, reszta może, bo jest przekazywana jako pusta w szablonach cytowania invalid = true table.insert(items, "'''Błąd! Brak kodu języka.") end else invalid = true local item = string.format("Błąd! Nieznany kod języka: %s. Sprawdź listę kodów.", languageCode) if parsedLanguageslanguageCode then duplicated = true mw.log("Powtórne przywołanie języka ("..languageCode..")") else parsedLanguageslanguageCode = item; table.insert(items, item) end end end if args2 or multi then -- wiele argumentów sugeruje przekazywnie każdego kodu języka w oddzielnych argumentach for i, v in ipairs(args) do if #v > 0 then formatItem(v) end end else -- jeden argument pozwala także wysłać wszystkie kody oddzielone spacją for languageCode in string.gmatch(args1, "%S+") do formatItem(languageCode) end end if #items 0 then if hiddenpl then -- podano tylko język polski, który jest ukryty else -- pusta lista kodów invalid = true table.insert(items, "Błąd! Brak kodu języka.") end end -- ostateczne formatowanie wyniku local result = {} if #items > 0 then if (countGood > 0) and hiddenpl then -- przywracam język polski jeśli lista zawiera więcej niż jeden język table.insert(items, 1, parsedLanguages.pl) hiddenpl = false end table.insert(result, "(") table.insert(result, table.concat(items, " • ")) table.insert(result, ")") end if mw.title.getCurrentTitle().namespace 0 then if warning then table.insert(result, "wikipedia:pl:Kategoria:Częste błędy kodu w szablonie lang") end if invalid then table.insert(result, "wikipedia:pl:Kategoria:Nierozpoznany kod języka w szablonie lang") end if hiddenpl then table.insert(result, "wikipedia:pl:Kategoria:Szablon lang z ukrytym językiem polskim") end if modified or duplicated then table.insert(result, "wikipedia:pl:Kategoria:Szablon lang z kodem języka wymagającym poprawki") end end return table.concat(result, "") end function lang.lang(frame) return list(frame, true, true) end lang"język" = function(frame) return list(frame, false, true) end return lang